/*
 *
 *  * 版权声明和许可协议
 *  *
 *  * 版权所有 (c) 2023 纽百特®
 *  * 版权所有，保留所有权利
 *  *
 *  * 本软件使用 MIT 许可协议进行许可，详情请参阅：
 *  *
 *  *   https://opensource.org/licenses/MIT
 *  *
 *  * 更多信息，请访问我们的网站：
 *  *
 *  *   http://www.nbsaas.com
 *  *
 *  * 纽百特® 是西安纽百特科技有限责任公司的注册商标，未经授权不得使用。
 *
 */

package com.nbsaas.boot.chain;

import com.nbsaas.boot.rest.response.ResponseObject;

import java.util.Objects;

public interface Command<Request, Response> {

    ResponseObject<Response> execute(Request request);

    default Command<Request, Response> before(Command<Request, Response> command) {
        Objects.requireNonNull(command);
        return (Request request) -> {
            ResponseObject<Response> temp = command.execute(request);
            if (temp.getCode() == 200) {
                return execute(request);
            } else {
                return temp;
            }
        };
    }

    default Command<Request, Response> after(Command<Request, Response> command) {
        Objects.requireNonNull(command);

        return (Request request) -> {
            ResponseObject<Response> temp = execute(request);
            if (temp.getCode() == 200) {
                return command.execute(request);
            } else {
                return temp;
            }
        };
    }

}
